package com.fyb.basic.juc.forkjoin;

import java.util.concurrent.RecursiveTask;

/**
 * @Author：MR.FANG
 * @name：AccumulateTask
 * 计算0-100 的累加和 采用forkJoin框架实现
 * 递归执行的异步任务子类 AccumulateTask 顶层父类 ForkJoinTask
 * @Date：2025/7/2 下午2:34
 */
public class AccumulateTask extends RecursiveTask<Integer> {

    /**
     * 定义任务拆解的阈值
     */
    private static final int THRESHOLD = 10;
    /**
     * 累加的其实编号
     */
    private int start;
    /**
     * 累加的结束编号
     */
    private int end;

    public AccumulateTask(int start, int end) {
        this.start = start;
        this.end = end;
    }

    @Override
    protected Integer compute() {
        // 返回结果
        int sum = 0;
        // 判断任务的规模 若小于指定的阈值 就直接进行计算
        boolean flag = (end - start) <= THRESHOLD;
        if (flag) {
            for (int i = start; i <= end; i++) {
                sum += i;
            }
            System.out.println("执行任务 计算" + start + "到" + end + "的和,結果是 sum = " + sum);
        } else {
            System.out.println("切割任务：将" + start + "到" + end + "的和一分为二");
            // 任务过大继续拆分 切割 采用Recursive递归计算
            int mid = (start + end) / 2;
            AccumulateTask lTask = new AccumulateTask(start, mid);
            AccumulateTask rTask = new AccumulateTask(mid + 1, end);
            // 依次调用每隔任务的fork 方法执行子任务
            lTask.fork();
            rTask.fork();

            // 等待子任务执行完成 依次调用每个子任务的join方法 进行结果的合并
            Integer leftResult = lTask.join();
            Integer rightResult = rTask.join();
            sum = leftResult + rightResult;

        }
        return sum;
    }
}
